package com.shop.shopcommon.utils;

import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

//@Data
//public class MultiDelayMessage<T> implements Serializable {
//    // 消息体
//    private T data;
//    // 记录延迟时间的集合
//    private List<Long> delayMillis;
//
//    public MultiDelayMessage(T data, List<Long> delayMillis) {
//        if (data == null) {
//            throw new IllegalArgumentException("Data cannot be null when creating MultiDelayMessage. Check the message data source.");
//        }
//        // 修改此处逻辑，当delayMillis为空时，设置默认空列表
//        this.delayMillis = (delayMillis == null || CollectionUtils.isEmpty(delayMillis))? new ArrayList<>() : new ArrayList<>(delayMillis);
//        this.data = data;
//    }
@Data
public class MultiDelayMessage implements Serializable {
    // 消息体
    private String data;
    // 记录延迟时间的集合
    private List<Long> delayMillis;

    public MultiDelayMessage(String data, List<Long> delayMillis) {
        if (data == null) {
            throw new IllegalArgumentException("Data cannot be null when creating MultiDelayMessage. Check the message data source.");
        }
        // 修改此处逻辑，当delayMillis为空时，设置默认空列表
        this.delayMillis = (delayMillis == null || CollectionUtils.isEmpty(delayMillis))? new ArrayList<>() : new ArrayList<>(delayMillis);
        this.data = data;
    }

//    public static <T> MultiDelayMessage<T> of(T data, Long... delayMillis) {
//        if (delayMillis == null || delayMillis.length == 0) {
//            // 这里可以考虑根据需求返回一个特定的默认实例，或者保持原样抛出异常，以下是返回默认实例的示例（可按需调整）
//            return new MultiDelayMessage<>(data, new ArrayList<>());
//            // 若保持原样抛出异常，则使用下面这行代码：
//            // throw new IllegalArgumentException("DelayMillis array cannot be null or empty when using the 'of' method. Check the input parameters for delay values.");
//        }
//        List<Long> delayList = new ArrayList<>();
//        // 使用CollectionUtils.addAll方法将可变参数转换为列表
//        CollectionUtils.addAll(delayList, delayMillis);
//        return new MultiDelayMessage<>(data, delayList);
//    }

    public static MultiDelayMessage of(String data, Long... delayMillis) {
        if (delayMillis == null || delayMillis.length == 0) {
            // 这里返回一个默认实例，delayMillis为空列表
            return new MultiDelayMessage(data, new ArrayList<>());
        }
        List<Long> delayList = new ArrayList<>();
        // 使用CollectionUtils.addAll方法将可变参数转换为列表
        CollectionUtils.addAll(delayList, delayMillis);
        return new MultiDelayMessage(data, delayList);
    }

    // 获取并移除下一个延迟时间
    // Returns: 队列中的第一个延迟时间
    public Long removeNextDelay() {
        return delayMillis.remove(0);
    }

    // 是否还有下一个延迟时间
    public boolean hasNextDelay() {
        return!delayMillis.isEmpty();
    }
}